package day23.test;

/**
 * Student类表示一个学生对象，包含姓名、年龄和成绩三个属性
 * 实现了Comparable接口，支持按照指定规则进行排序：
 * 1. 名字为"tom"的学生始终排在第一位
 * 2. 按姓名降序排列
 * 3. 按年龄升序排列
 * 4. 按成绩降序排列
 */
public class Student implements Comparable<Student> {
    // 学生姓名
    private String name;
    // 学生年龄
    private int age;
    // 学生成绩
    private double score;

    /**
     * 无参构造方法，创建一个空的学生对象
     */
    public Student() {
    }

    /**
     * 有参构造方法，创建学生对象并初始化属性
     * @param name 学生姓名
     * @param age 学生年龄
     * @param score 学生成绩
     */
    public Student(String name, int age, double score) {
        this.name = name;
        this.age = age;
        this.score = score;
    }

    /**
     * 获取学生姓名
     * @return 学生姓名
     */
    public String getName() {
        return name;
    }

    /**
     * 设置学生姓名
     * @param name 学生姓名
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取学生年龄
     * @return 学生年龄
     */
    public int getAge() {
        return age;
    }

    /**
     * 设置学生年龄
     * @param age 学生年龄
     */
    public void setAge(int age) {
        this.age = age;
    }

    /**
     * 获取学生成绩
     * @return 学生成绩
     */
    public double getScore() {
        return score;
    }

    /**
     * 设置学生成绩
     * @param score 学生成绩
     */
    public void setScore(double score) {
        this.score = score;
    }

    /**
     * 实现Comparable接口的compareTo方法，定义学生对象的排序规则
     * @param other 要比较的另一个学生对象
     * @return 比较结果：负数表示当前对象排在前面，0表示相等，正数表示当前对象排在后面
     */
    @Override
    public int compareTo(Student other) {
        // tom学生始终排在第一位
        if (this.name.equals("tom")) {
            return -1;
        }
        if (other.name.equals("tom")){
            return 1;
        }

        // 按姓名降序排列
        int nameCompare = other.name.compareTo(this.name);
        if (nameCompare != 0) {
            return nameCompare;
        }

        // 按年龄升序排列
        int ageCompare = Integer.compare(this.age, other.age);
        if (ageCompare != 0) {
            return ageCompare;
        }

        // 按成绩降序排列
        return Double.compare(other.score, this.score);
    }

    /**
     * 重写toString方法，返回学生对象的字符串表示形式
     * @return 学生对象的字符串表示
     */
    @Override
    public String toString() {
        return "Student{name='" + name + "', age=" + age + ", score=" + score + "}";
    }
}